package br.com.registrofinancas.controller;

import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;

import android.os.AsyncTask;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.TabHost;
import android.widget.TextView;
import br.com.registrofinancas.R;
import br.com.registrofinancas.database.MovimentosEntradaDAO;
import br.com.registrofinancas.database.MovimentosSaidaDAO;
import br.com.registrofinancas.util.CalendarUtilNavegavacaoMes;
import br.com.registrofinancas.util.CurrencyUtils;
import br.com.registrofinancas.view.CalendarioActivity;
import br.com.registrofinancas.view.FinancasActivity;

public class FinancasActivityTotaisController {
	
	private static FinancasActivityTotaisController instance = new FinancasActivityTotaisController();
	private FinancasActivity financasActivity;
	private GregorianCalendar mes;
	private TextView mesAnoHeaderNavegacao;
	private SimpleDateFormat formatoMesAnoHeaderNavegacao;
	private TextView tvTotalSaldo;
	private TextView tvTotalGastos;
	private TextView tvTotalGanhos;
	private TextView tvQuantidadeEntradas;
	private TextView tvTotalDeGanhos;
	private TextView tvSaldo;
	private TextView tvGastos;
	private TextView tvTotalPorcentagemGanhos;
	private TextView tvTotalPorcentagemGastos;
	private TextView tvLabelSaldo;
	private FinancasActivityTotaisController() {}
	
	public static FinancasActivityTotaisController getInstance() {
		return instance;
	}
	
	private OnClickListener btnPreviousMonth(){
		return new OnClickListener() {			
			@Override
			public void onClick(View v) {
				GregorianCalendar mMes = CalendarUtilNavegavacaoMes.setPreviousMonth(mes);
				CalendarUtilNavegavacaoMes.setMes(financasActivity, mMes, mesAnoHeaderNavegacao, formatoMesAnoHeaderNavegacao);
				atualizarDados();
			}
		};
	}
	
	private OnClickListener btnNextMonth(){
		return new OnClickListener() {			
			@Override
			public void onClick(View v) {
				GregorianCalendar mMes = CalendarUtilNavegavacaoMes.setNextMonth(mes);
				CalendarUtilNavegavacaoMes.setMes(financasActivity, mMes, mesAnoHeaderNavegacao, formatoMesAnoHeaderNavegacao);
				atualizarDados();		
			}
		};
	}

	public void setTab(FinancasActivity financasActivity) {
		this.financasActivity = financasActivity;		
		((ImageButton) financasActivity.findViewById(R.id.financas_navegacao_data_totais_ib_previous_month)).setOnClickListener(btnPreviousMonth());
		((ImageButton) financasActivity.findViewById(R.id.financas_navegacao_data_totais_ib_next_month)).setOnClickListener(btnNextMonth());
		
		tvTotalSaldo = (TextView) financasActivity.findViewById(R.id.activity_financas_totais_tv_saldos);
		tvTotalGanhos = (TextView) financasActivity.findViewById(R.id.activity_financas_totais_tv_total_ganhos);
		tvTotalGastos = (TextView) financasActivity.findViewById(R.id.activity_financas_totais_tv_total_gastos);
		
		tvQuantidadeEntradas = (TextView) financasActivity.findViewById(R.id.activity_financas_tv_quatidade_entradas);
		tvTotalDeGanhos = (TextView) financasActivity.findViewById(R.id.activity_financas_tv_total_de_ganhos);
			
		tvTotalPorcentagemGastos = (TextView) financasActivity.findViewById(R.id.financas_totais_tv_porcentagem_gastos);
		tvTotalPorcentagemGanhos = (TextView) financasActivity.findViewById(R.id.financas_totais_tv_porcentagem_saldos);
		
		tvLabelSaldo = (TextView) financasActivity.findViewById(R.id.activity_financas_saldo);	 
		
		tvSaldo = (TextView) financasActivity.findViewById(R.id.activity_financas_tv_totais_porcetagem_ganho);
		tvGastos = (TextView) financasActivity.findViewById(R.id.activity_financas_tv_totais_porcetagem_gasto);
			
		setupHeaderData();
		
		CalendarUtilNavegavacaoMes.setMes(financasActivity, mes, mesAnoHeaderNavegacao, formatoMesAnoHeaderNavegacao);
		
		atualizarDados();
		
	}
	
	private void setupHeaderData(){
		mes = (GregorianCalendar) GregorianCalendar.getInstance();
		mesAnoHeaderNavegacao = (TextView) financasActivity.findViewById(R.id.financas_navegacao_data_totais_tv_mes_ano_atual);
		formatoMesAnoHeaderNavegacao = new SimpleDateFormat("MMM/yyyy");
	}
	
	
	
	private void atualizarDados(){
		MovimentosEntradaDAO entrada = new MovimentosEntradaDAO(financasActivity);
		MovimentosSaidaDAO saida = new MovimentosSaidaDAO(financasActivity);
		Double totalGanhos = entrada.getValorTotalEntradasPorMes(mes.getTime());
		Double totalGastos = saida.getValorTotalSaidasPorMes(mes.getTime());
		Double saldo = totalGanhos - totalGastos; 
					
		double mPorcentagemGanhos = 0.0;
		double mPorcentagemGastos = 0.0;
		
		if (totalGanhos > 0) { 
			mPorcentagemGanhos = (saldo * 100) / totalGanhos;
		}
		
		if (totalGastos > 0) {
			mPorcentagemGastos = (totalGastos * 100) / totalGanhos ;	
		}
						
		tvTotalPorcentagemGanhos.setText(String.valueOf(format(mPorcentagemGanhos))+"%");
		tvTotalPorcentagemGastos.setText(String.valueOf(format(mPorcentagemGastos))+"%");
		
		tvQuantidadeEntradas.setText(String.valueOf(entrada.getEntradasPorMes(mes.getTime()).size()));
		tvTotalDeGanhos.setText(CurrencyUtils.formataValor(totalGanhos, financasActivity));
		
		tvTotalGanhos.setText(CurrencyUtils.formataValor(totalGanhos, financasActivity));
		tvTotalGastos.setText(CurrencyUtils.formataValor(totalGastos, financasActivity));
		tvTotalSaldo.setText(CurrencyUtils.formataValor(saldo, financasActivity));
		
		tvSaldo.setText(CurrencyUtils.formataValor(saldo, financasActivity));
		tvGastos.setText(CurrencyUtils.formataValor(totalGastos, financasActivity));
	
		tvLabelSaldo.setText("Saldo: ("+String.valueOf(format(mPorcentagemGanhos)+"%)"));
		
	}
		
	public static String format(double x) {  
	    return String.format("%.2f", x);  
	}  
	
}
